package kr.co.valueworks.fishing.activity;

import java.io.IOException;
import java.util.List;
import java.util.Locale;

import kr.co.valueworks.fishing.R;
import kr.co.valueworks.fishing.R.drawable;
import kr.co.valueworks.fishing.R.id;
import kr.co.valueworks.fishing.R.layout;

import com.google.android.maps.GeoPoint;
import com.google.android.maps.MapActivity;
import com.google.android.maps.MapController;
import com.google.android.maps.MapView;
import com.google.android.maps.Overlay;
import com.google.android.maps.Projection;

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Point;
import android.location.Address;
import android.location.Criteria;
import android.location.Geocoder;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.util.Log;

public class FishingMap extends MapActivity implements LocationListener{

	final int INITIAL_ZOOM_LEVEL = 16;
	
	MapView mapView;
	MapController controller;
	LocationManager manager;
	String provider;
	Geocoder coder;
	String TAG = "FishingMap";
	String latitude;
	String longitude;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.fishing_map);
		
		Intent intent = getIntent();
		latitude = intent.getStringExtra("latitude");
		longitude = intent.getStringExtra("longitude");
		
		double dLatitude = Double.parseDouble(latitude);
		double dLongitude = Double.parseDouble(longitude);
		
		GeoPoint point = getPoint(dLatitude,dLongitude);
		mapView = (MapView)findViewById(R.id.fishingMapView);
		mapView.setSatellite(false);
		mapView.setStreetView(true);
		mapView.setBuiltInZoomControls(true);
		
		controller = mapView.getController();
        controller.setZoom(INITIAL_ZOOM_LEVEL);
        controller.setCenter(point);

		checkProvider();
		coder = new Geocoder(getApplicationContext(), Locale.KOREA);	
		
		Location loc = new Location("");
		loc.setLatitude(dLatitude);
		loc.setLongitude(dLongitude);		
		onLocationChanged(loc);
	}

	@Override
	protected void onResume() {
		super.onResume();
		/*
		// 마지막으로 얻은 위치정보가 있으면 보기
	    Location loc = manager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
	    if (loc != null) {
	       onLocationChanged(loc);
	    }
	    */
	    // GPS Provider로 부터 위치 정보를 수신하게 되면 호출될 LocationListener 등록
	    manager.requestLocationUpdates(LocationManager.GPS_PROVIDER,0,0,this);		
	}
	
	@Override
	protected void onPause() {
		super.onPause();
	       // 위치정보 통지 등록 취소
	    manager.removeUpdates(this);		
	}

	@Override
	protected boolean isRouteDisplayed() {
		return false;
	}

	private GeoPoint getPoint(double lat, double lon) {
		return(new GeoPoint((int)(lat*1000000.0), (int)(lon*1000000.0)));
	}
	
	// 지도상에 화살표 이미지와 텍스트 문자열을 그리기위한 메서드
	public void setOverlay(GeoPoint p, String addr) {
	      Bitmap icon = BitmapFactory.decodeResource(getResources(),R.drawable.pin_spot2);
	      IconOverlay overlay = new IconOverlay(icon, p, addr);
	      List<Overlay> overlays = mapView.getOverlays();
	      // overlays.clear(); //기존 overlay되어 있는 정보를 제거한다.
	      overlays.add(overlay);
	}
	 
	// GeoCoder를 이용해서 수신된 위치정보에 대한 주소 정보를 찾아서 문자열로 
	// 반환하는 메서드 
	private  String showLocationName(Location loc) {
	      double latitude = loc.getLatitude();
	      double longitude = loc.getLongitude();
	      StringBuffer buff = new StringBuffer();
	      try {
	          List<Address> addrs =
	          coder.getFromLocation(latitude, longitude, 1);
	 
	          for (Address addr : addrs) {
	              int index = addr.getMaxAddressLineIndex();
	              for (int i = 0; i <= index; ++i) {
	                     buff.append(addr.getAddressLine(i));
	                     buff.append(" ");
	               }
	              //buff.append("\n");
	           }
	        } catch (IOException e) {
	               Log.e(TAG, e.toString());
	      }
	      return buff.toString();
	}
	 
	// 가장 베스트하게 사용가능한 Provider를 검색한다.
	public void checkProvider() {
		manager = (LocationManager)getSystemService(Context.LOCATION_SERVICE);
		Criteria cta = new Criteria();
		cta.setAccuracy(Criteria.ACCURACY_FINE);
		cta.setPowerRequirement(Criteria.POWER_HIGH);
		cta.setAltitudeRequired(false);
		cta.setSpeedRequired(false);
		cta.setCostAllowed(false);
		provider = manager.getBestProvider(cta, true);
	}
	 
	// 위치정보가 변경되면 호출된다.
	public void onLocationChanged(Location location) {
	          GeoPoint gp = new GeoPoint((int)(location.getLatitude()*1E6),
	                                                     (int)(location.getLongitude()*1E6));          
	          controller.animateTo(gp);
	          setOverlay(gp,showLocationName(location));
	}
	 
	// 위치정보를 제공하는 프로바이더가 disable되었을때 호출된다.
	public void onProviderDisabled(String provider) {
	}
	 
	// 위치정보를 제공하는 프로바이더가 enable되었을때 호출된다.
	public void onProviderEnabled(String provider) {
	}
	 
	// 위치정보를 제공하는 프로바이더가 enable 또는 disable되었을때 호출된다.
	public void onStatusChanged(String provider, int status,
	Bundle extras) {
	}
	 
	// 지도위에 이미지나 텍스트를 출력하기 위한 클래스 
	private class IconOverlay extends Overlay {
	 
	      Bitmap mIcon;
	      GeoPoint mPoint;
	      String addr;
	      int mOffsetX;
	      int mOffsetY;
	 
	      IconOverlay(Bitmap icon, GeoPoint initial, String addr) {
	          mIcon = icon;
	          mOffsetX = 0 - icon.getWidth() / 2;
	          mOffsetY = 0-icon.getHeight();
	          mPoint = initial;
	          this.addr=addr;
	       }
	 
	// 지도를 탭하면 호출된다.
	@Override
	public boolean onTap(GeoPoint point, MapView mapView) {
	        //mPoint = point;
	        return super.onTap(point, mapView);
	}
	 
	// 지도를 그릴 때, shadow = true, shadow = false를 2 번 호출
	@Override
	public void draw(Canvas canvas, MapView mapView, boolean shadow) {
	     super.draw(canvas, mapView, shadow);
	     if (!shadow) {
	      // 지도상 위치와 그림을 그릴  Canvas상의  좌표 변환을 위한 객체
	     Projection projection = mapView.getProjection();
	     Point point = new Point();
	     projection.toPixels(mPoint, point);
	 
	     Paint paint=new Paint();
	     paint.setAntiAlias(true);  
	     paint.setTextSize(14);   
	     paint.setColor(Color.RED);
	     int addrLen = addr.length();
	     canvas.drawText(addr, point.x-(addrLen*5), point.y+20, paint);   // 지정된 좌표에 문자를 출력
	 
	     point.offset(mOffsetX, mOffsetY);
	     canvas.drawBitmap(mIcon, point.x, point.y, null);  //지정된 좌표에 화살표 이미지 출력
	     }
	  }
	}//IconOverlay끝	
}
